package ini

import (
	"fmt"
)

type Section struct {
	name     string
	keys     map[string]*Key
}

// newSection返回一个新节
func newSection(name string) *Section {
	return &Section{
		name:  name,
		keys:  make(map[string]*Key),
	}
}

// NewKey为给定节创建一个新的键，若已存在则更新
func (s *Section) NewKey(name, value string) (*Key, error) {
	s.keys[name] = newKey(name, value)
	return s.keys[name], nil
}

// Name返回节的名
func (s *Section) Name() string {
	return s.name
}

// Key假定给定的键存在，若不存在则新建一个值为空的键
func (s *Section) Key(name string) *Key {
	key, err := s.GetKey(name)
	if err != nil {
		key, _ = s.NewKey(name, "")
	}
	return key
}

// GetKey根据给定的名返回键，若不存在则会返回nil和错误
func (s *Section) GetKey(name string) (*Key, error) {
	key := s.keys[name]
	if key == nil {
		return nil, &errorKeyNotExists{s.name, name}
	}
	return key, nil
}

// Keys返回含有该节全部键的切片
func (s *Section) Keys() []*Key {
	keys := make([]*Key, len(s.keys))
	i := 0
	for _, v := range s.keys {
		keys[i] = v
		i++
	}
	return keys
}

type errorKeyNotExists struct {
	sectionName string
	keyName     string
}

func (e *errorKeyNotExists) Error() string {
	return fmt.Sprintf("[%s]中的键%s不存在", e.sectionName, e.keyName);
}
